공공데이터 포털에서 데이터 가져오기를 통해 입수한 데이터를 후속 시각화와 모형개발 작업을 위해 깔끔한 정제작업을 수행한다. 특히, 2020-11-06 중복된 행이 포함되어 중복 제거작업을 선행하여 처리한다. 2020-04-02 ~ 2020-04-06 사이 결측값이 있어 pad_by_time() 함수로 결측된 기간을 생성시키고 나서, ts_impute_vec() 함수로 선형보간(period = 1)을 통해 결측값을 채워넣어 정제작업이 완료된 데이터를 가지고 탐색적 데이터 작업을 수행한다.
library(tidyverse)
library(httr)
library(rvest)
library(glue)
library(lubridate)
covid_age_gender_df <- read_rds("data/covid_age_gender_clean.rds")
covid_age_gender_df# A tibble: 2,949 x 7
날짜 구분 검사자 확진자 사망자 감염율 치명율
<date> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2020-04-02 0-9 9825. 112 0 0.0114 0
2 2020-04-03 0-9 9925. 115. 0 NA NA
3 2020-04-04 0-9 10026. 118. 0 NA NA
4 2020-04-05 0-9 10127. 120. 0 NA NA
5 2020-04-06 0-9 10227. 123. 0 NA NA
6 2020-04-07 0-9 10328. 126 0 0.0122 0
7 2020-04-08 0-9 10413. 126 0 0.0121 0
8 2020-04-09 0-9 10407. 128 0 0.0123 0
9 2020-04-10 0-9 10488. 129 0 0.0123 0
10 2020-04-11 0-9 10484. 130 0 0.0124 0
# ... with 2,939 more rows
탐색적 데이터 분석을 통해 전반적인 추세를 살펴봄으로 인해 숨겨진 데이터의 오류도 찾아낼 수 있다.
library(timetk)
covid_age_daily_df <- covid_age_gender_df %>%
filter(날짜 >= "2020-04-09") %>%
filter(!str_detect(구분, pattern = "(남성)|(여성)")) %>%
timetk::summarise_by_time(.date_var = 날짜,
.by = "day",
누적검사자 = sum(검사자),
누적확진자 = sum(확진자),
누적사망자 = sum(사망자)
) %>%
mutate(누적사망자 = ifelse(between_time(날짜, start_date = "2020-08-02", end_date = "2020-08-03"), 301, 누적사망자),
누적사망자 = ifelse(날짜 == "2020-06-23", 280, 누적사망자)) %>%
mutate(검사자 = 누적검사자 - lag(누적검사자, n = 1L),
확진자 = 누적확진자 - lag(누적확진자, n = 1L),
사망자 = 누적사망자 - lag(누적사망자, n = 1L))
covid_age_daily_df %>%
select(-contains("누적")) %>%
pivot_longer(-날짜) %>%
plot_time_series(.date_var = 날짜,
.value = value,
.facet_var = name,
.facet_ncol = 2)covid_age_gender_df %>%
arrange(날짜)# A tibble: 2,949 x 7
날짜 구분 검사자 확진자 사망자 감염율 치명율
<date> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2020-04-02 0-9 9825. 112 0 0.0114 0
2 2020-04-02 10-19 9791. 515 0 0.0526 0
3 2020-04-02 20-29 9786. 2656 0 0.271 0
4 2020-04-02 30-39 9787. 1012 1 0.103 0.0062
5 2020-04-02 40-49 9784. 1312 1 0.134 0.0062
6 2020-04-02 50-59 9788. 1851 10 0.189 0.0617
7 2020-04-02 60-69 9786. 1235 22 0.126 0.136
8 2020-04-02 70-79 9789. 651 46 0.0665 0.284
9 2020-04-02 80 이상 9779. 442 82 0.0452 0.506
10 2020-04-02 여성 9785. 5881 80 0.601 0.494
# ... with 2,939 more rows
연령대별로 치명률(Death Rate)을 치명률이 높은 고연령대를 중심으로 시각화하면 연령대가 높아짐에 따라 높아짐을 확인할 수 있다.
covid_age_gender_df %>%
mutate(치명율 = 치명율 * 100) %>%
filter(!str_detect(구분, pattern = "(남성)|(여성)")) %>%
filter(!str_detect(구분, "(0-11)|(0-9)|(10-19)|(20-29)|(30-39)|(40-49)")) %>%
timetk::plot_time_series(.date_var = 날짜,
.value = 치명율,
.facet_var = 구분,
.interactive = FALSE,
.smooth = FALSE,
.facet_ncol = 4,
.facet_scales = "fixed") +
scale_y_continuous(labels = scales::comma) +
scale_x_date(labels = scales::date_format(format = "%y-%m")) +
labs(title = "코로나19 연령대별 치명률 추세")고연령층(50세 이상)을 대상으로 살펴보면 남성이 여성보다 다소 높은 것을 확인할 수 있다.
covid_age_gender_df %>%
mutate(치명율 = 치명율 * 100) %>%
filter(!str_detect(구분, "(0-11)|(0-9)|(10-19)|(20-29)|(30-39)|(40-49)")) %>%
filter(str_detect(구분, pattern = "(남성)|(여성)")) %>%
timetk::plot_time_series(.date_var = 날짜,
.value = 치명율,
.facet_var = 구분,
.interactive = FALSE,
.smooth = FALSE,
.facet_ncol = 2,
.facet_scales = "fixed") +
scale_y_continuous(labels = scales::comma) +
scale_x_date(labels = scales::date_format(format = "%y-%m")) +
labs(title = "코로나19 고연령층 성별 치명률 추세")COVID19 데이터먼저 원본 데이터를 timetk 팩키지 plot_time_series() 함수를 사용해서 시각화해보자.
library(tidyverse)
library(timetk)
korea_df <- read_rds("data/COVID_korea.rds")
korea_df %>%
pivot_longer(-날짜, names_to = "구분", values_to="사람수") %>%
plot_time_series(.date_var = 날짜,
.value = 사람수,
.facet_var = 구분,
.smooth = FALSE,
.facet_ncol = 2,
.title = "한국 코로나19 누적 추세")먼저 원본 데이터를 가공하여 일별 추세를 timetk 팩키지 plot_time_series() 함수를 사용해서 시각화해보자.
korea_daily_df <- korea_df %>%
mutate(검사자 = 누적검사자 - lag(누적검사자, n = 1L),
확진자 = 누적확진자 - lag(누적확진자, n = 1L),
회복자 = 누적회복자 - lag(누적회복자, n = 1L),
사망자 = 누적사망자 - lag(누적사망자, n = 1L) ) %>%
drop_na() %>%
select(-contains("누적"))
korea_daily_df %>%
pivot_longer(-날짜, names_to = "구분", values_to="사람수") %>%
plot_time_series(.date_var = 날짜,
.value = 사람수,
.facet_var = 구분,
.smooth = FALSE,
.facet_ncol = 2,
.title = "한국 코로나19 일별 추세")데이터 과학자 이광춘 저작
kwangchun.lee.7@gmail.com